﻿/*   
    Copyright (C) 2009 Galaktika Corporation ZAO

    This file is a part of Galaktika.BusinessMonitor
 
    Galaktika.BusinessMonitor is a free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.
      
    You should have received a copy of the GNU General Public License
    along with Galaktika.BusinessMonitor.  If not, see <http://www.gnu.org/licenses/>.
  
    If GPL v.3 is not suitable for your products or company,
    Galaktika Corp provides Galaktika.BusinessMonitor under a flexible commercial license
    designed to meet your specific usage and distribution requirements.
    If you have already obtained a commercial license from Galaktika Corp,
    you can use this file under those license terms.
*/

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Galaktika.BI.Silverlight.ClientApp.Web.Runtime;
using Galaktika.BI.Silverlight.Controls;
using Galaktika.BI.Silverlight.Commands;
using Galaktika.BI.Silverlight.ClientApp.Web.Runtime.DataAccess;
using Galaktika.BI.Silverlight.ClientApp.Web.Runtime.Services;
using Galaktika.BI.Silverlight.Services;
using Ranet.Olap.Core.Providers.ClientServer;
using Microsoft.AnalysisServices.AdomdClient;

namespace Galaktika.BI.Silverlight.ClientApp.Web.Commands.PivotGrid
{
    public delegate void MethodInvoker();

    public class UpdateCubeCommand : ServerCommand
    {
        public UpdateCubeCommand(InvokeSchema invoker)
            : base(Galaktika.BI.Silverlight.Commands.CommandId.UpdateCubeCommandId)
        {
            this.UpdateScript = invoker[KnownInvokeArgs.UpdateScript];
            this.SessionId = invoker[KnownInvokeArgs.SessionId];
            this.Args = XmlUtility.XmlStr2Obj<UpdateCubeArgs>(invoker[KnownInvokeArgs.UpdateCube]);
        }

        public string SessionId { get; private set; }
        public string UpdateScript { get; private set; }
        public UpdateCubeArgs Args { get; private set; }


        public override InvokeResultSchema Invoke()
        {
            InvokeResultSchema res = new InvokeResultSchema(base.Id);

            try
            {
                res.Content = this.DoUpdate(
                    this.Args,
                    this.SessionId,
                    new MethodInvoker(this.UpdateComplete),
                    new MethodInvoker(this.UpdateError));
                res.ContentType = KnownContentTypes.String;
            }
            catch (AdomdConnectionException connection_ex)
            {
                res.ContentType = KnownContentTypes.ADOMDError;
                res.Content = connection_ex.Message;
            }
            catch (AdomdErrorResponseException response_ex)
            {
                res.Content = response_ex.Message;
                res.ContentType = KnownContentTypes.ADOMDError;
            }
            return res;
        }

        private String DoUpdate(
            UpdateCubeArgs args, 
            string sessionId,
            MethodInvoker onComplete, 
            MethodInvoker onError)
        {
            try
            {
                //if (!String.IsNullOrEmpty(args.Script))
                //{
                //    PivotTableUpdater.UpdateSync(args, onComplete, onError);
                //}
                //else
                //{
                //}

                String script = this.UpdateScript;
                return PivotTableUpdater.UpdateSync(script, args, sessionId, onComplete, onError);
            }
            catch (Exception exc)
            {
                throw exc;
            }
        }

        private void UpdateComplete()
        {
        }

        private void UpdateError()
        {
        }
    }
}
